libcurl 이름 확인

이름 확인

libcurl이 수행할 수 있는 대부분의 전송에는 먼저 인터넷 주소로 변환되어야 하는 이름이 포함됩니다. 그것은 “이름 확인”입니다. URL에서 직접 숫자 IP 주소를 사용하면 일반적으로 이름 확인 단계를 피할 수 있지만 대부분의 경우 이름을 IP 주소로 수동으로 바꾸는 것이 쉽지 않습니다.

libcurl은 새로운 연결을 생성하기 보다는 기존 연결을 재사용하기 위해 열심히 노력합니다. 사용할 기존 연결을 확인하는 기능은 순전히 이름을 기반으로 하며 이름 확인이 시도되기 전에 수행됩니다. 이것이 재사용이 훨씬 더 빠른 이유 중 하나입니다. 재사용된 연결을 사용하는 전송은 호스트 이름을 다시 확인하지 않습니다.

연결을 재사용할 수 없는 경우 libcurl은 확인하려는 주소 집합으로 호스트 이름을 확인합니다. 일반적으로 이것은 IPv4 및 IPv6 주소를 모두 요청한다는 것을 의미하며 libcurl에 반환된 전체 집합이 있을 수 있습니다. 그런 다음 해당 주소 집합이 작동하거나 실패를 반환할 때까지 시도됩니다.

응용 프로그램은 CURLOPT_IPRESOLVE를 기본 값으로 설정하여 libcurl이 IPv4 또는 IPv6 확인 주소만 사용하도록 할 수 있습니다. 예를 들어 IPv6 주소만 사용하도록 요청합니다.

1
curl_easy_setopt(easy, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V6);

이름 확인자 백엔드

libcurl은 이 세 가지 다른 방법 중 하나로 이름 확인을 수행하도록 빌드할 수 있으며 사용되는 백엔드 방법에 따라 약간 다른 기능 세트와 때때로 수정된 동작을 얻습니다.

  1. 기본 백엔드는 새로운 도우미 스레드에서 “일반” libc 해석기 기능을 호출하므로 원하는 경우 여전히 세분화된 시간 초과를 수행할 수 있고 차단 호출이 포함되지 않습니다.
  2. 이전 시스템에서 libcurl은 표준 동기 이름 해석기 기능을 사용합니다. 불행히도 작동하는 동안 다중 핸들 블록 내에서 모든 전송을 수행하며 멋지게 시간 초과되는 것이 훨씬 더 어렵습니다.
  3. 스레드를 사용하지 않고 비동기식 이름 확인을 지원하는 c-ares 타사 라이브러리로 확인하기 위한 지원도 있습니다. 이것은 엄청난 수의 병렬 전송으로 더 잘 확장되지만 기본 이름 확인기 기능과 항상 100% 호환되는 것은 아닙니다.

HTTPS를 통한 DNS

libcurl이 사용하도록 빌드된 확인자 백엔드와는 별개로, 7.62.0부터는 사용자가 특정 DoH(DNS over HTTPS) 서버에 이름 주소를 요청할 수 있는 방법도 제공합니다. 이렇게 하면 일반적인 기본 리졸버 메서드와 서버를 사용하지 않고 전용 별도의 메서드와 서버를 요청합니다.

DoH 서버는 다음과 같이 CURLOPT_DOH_URL 옵션을 사용하여 전체 URL로 지정됩니다.

1
curl_easy_setopt(easy, CURLOPT_DOH_URL, "https://example.com/doh");

이 옵션에 전달되는 URL은 https://를 사용해야 하며 일반적으로 libcurl이 DoH 서버에 대한 연결을 통해 다중 DoH 요청을 수행할 수 있도록 HTTP/2 지원을 활성화하는 것이 좋습니다.

캐싱

이름이 확인되면 결과는 libcurl의 메모리 내 캐시에 저장되어 이름이 DNS 캐시에 유지되는 한 동일한 이름에 대한 후속 확인이 거의 즉시 이루어집니다. 기본적으로 각 항목은 캐시에 60초 동안 유지되지만 해당 값은 CURLOPT_DNS_CACHE_TIMEOUT으로 변경할 수 있습니다.

DNS 캐시는 curl_easy_perform을 사용하는 경우 easy 핸들 내에, 멀티 인터페이스를 사용하는 경우 멀티 핸들 내에 유지됩니다. 또한 공유 인터페이스를 사용하여 여러 개의 쉬운 핸들 간에 공유할 수 있습니다.

호스트에 대한 사용자 지정 주소

때로는 실제 호스트 이름에 “가짜” 주소를 제공하여 libcurl이 실제 이름 확인이 제안하는 주소 대신 다른 주소에 연결하도록 하는 것이 편리합니다.

CURLOPT_RESOLVE 옵션의 도움으로 응용 프로그램은 libcurl의 DNS 캐시를 지정된 호스트 이름 및 포트 번호에 대한 사용자 지정 주소로 미리 채울 수 있습니다.

포트 443의 example.com이 요청될 때 libcurl이 127.0.0.1에 연결되도록 하려면 애플리케이션에서 다음을 수행할 수 있습니다.

1
2
3
struct curl_slist *dns;
dns = curl_slist_append(NULL, "example.com:443:127.0.0.1");
curl_easy_setopt(curl, CURLOPT_RESOLVE, dns);

이렇게 하면 “가짜” 주소가 DNS 캐시에 저장되기 때문에 리디렉션 등을 따라갈 때도 작동합니다.

네임서버 옵션

c-ares를 사용하도록 빌드된 libcurl의 경우 사용할 DNS 서버와 방법을 세밀하게 제어할 수 있는 몇 가지 옵션이 있습니다. 이것은 이름 해석을 위한 표준 시스템 호출이 사용될 때 사용할 수 없는 권한이기 때문에 순전히 c-are 빌드로 제한됩니다.

  • CURLOPT_DNS_SERVERS를 통해 애플리케이션은 전용 DNS 서버 세트를 사용하도록 선택할 수 있습니다.
  • CURLOPT_DNS_INTERFACE를 사용하면 기본 인터페이스 대신 DNS를 사용할 네트워크 인터페이스를 libcurl에 알릴 수 있습니다.
  • CURLOPT_DNS_LOCAL_IP4CURLOPT_DNS_LOCAL_IP6을 사용하면 응용 프로그램에서 DNS를 바인딩할 특정 네트워크 주소를 지정할 수 있습니다.

전역 DNS 캐시 없음

CURLOPT_DNS_USE_GLOBAL_CACHE라는 옵션은 한때 curl에 전역 DNS 캐시를 사용하도록 지시했습니다. 이 기능은 7.65.0 이후 제거되었으므로 이 옵션이 여전히 존재하는 동안에는 아무 것도 하지 않습니다.

공유하기